package rbac.service;

import rbac.domain.dto.DeptDto;
import rbac.domain.entity.Dept;
import rbac.domain.vo.DeptVo;
import rbac.domain.vo.Result;

import java.util.Arrays;

/**
 * 业务层-部⻔管理模块
 */

public class DeptService {
    public static int DATA_SIZE = 100; // 实体对象存储量设为最多100个
    public static Dept[] data = new Dept[DATA_SIZE + 1]; // 实体类的Dept领域对象
    public static int idCounter = 1;

    public static Result list(){
        DeptVo[] temp = new DeptVo[DATA_SIZE]; // 创建⼀个临时数组，⽤于存储有效的部⻔数据
        int length = 0; // ⽤于记录临时数组的实际存储⻓度

        for (int i = 1; i < idCounter; i++){
            if (data[i] != null){
                temp[length++] = convertToVo(data[i]);
            }
        }
        return Result.success(" 查询成功", Arrays.copyOf(temp, length)); // 返回临时数组的有效部分
    }

    public static Dept createEntity(DeptDto dto, int id){
        Dept dept = new Dept(dto.name, dto.phone); // 创建新的部⻔对象，使⽤传⼊的部⻔名称和电话

        dept.id = id; // 给每个部门分配唯一的id

        return dept;
    }

    public static Result create(DeptDto dto){ // 用dto数据传输对象来传入参数
        if (idCounter > DATA_SIZE){
            return Result.failure("创建失败，超出存储容量");
        }

        Dept dept = createEntity(dto, idCounter++);

        data[dept.id] = dept; // 将新部⻔对象存储到数据数组中

        return Result.success(" 创建成功", null);
    }

    // 将部⻔实体对象转换为部⻔视图对象
    public static DeptVo convertToVo(Dept dept){
        // 通过类名直接调⽤，⽆需创建 DeptService类的实例
        return new DeptVo(dept.id, dept.name, dept.phone);
    }

    public static boolean existsById(int id){
        return id >= 1 && id < idCounter && data[id] != null;
    }

    public static void updateEntity(DeptDto dto, Dept dept) {
        dept.name = dto.name; // 原来在实体类的数据 -->-替换-> 刚刚输入在dto类的数据
        dept.phone = dto.phone;
    }

    public static Result update(DeptDto dto, int id){
        if (!existsById(id)){
            return Result.failure("更新失败，不存在该数据");
        }

        Dept dept = data[id]; // 获取指定ID 的部⻔对象

        updateEntity(dto, dept);

        return Result.success(" 更新成功", null);
    }

    public static Result delete(int id){
        if (!existsById(id)){
            return Result.failure("删除失败，不存在该数据");
        }

        // 将指定ID的部⻔数据置为 null，表示删除该数据
        data[id] = null;

        return Result.success("删除成功", null);
    }

}

